#include "stdafx.h"
#include "VPErrorHandler.h"

VPErrorHandler* VPErrorHandler::m_spErrorHandler = nullptr;
std::wofstream VPErrorHandler::m_wofsLogFile;
std::wstring VPErrorHandler::m_strLogPath;

VPErrorHandler::VPErrorHandler()
{
    GetLogPath();
    CreateLogFile();
}

VPErrorHandler::~VPErrorHandler()
{
    m_wofsLogFile.close();
}

void VPErrorHandler::Initialize()
{
    if (m_spErrorHandler == nullptr)
    {
        m_spErrorHandler = new VPErrorHandler();
    }
}

void VPErrorHandler::WriteLog(const std::wstring& strFunctionName, const std::wstring& strErrorMessage)
{
    std::wstring strLocalTime;
    VPErrorHandler::GetInstance()->GetLocalTime(strLocalTime);

    std::wstring strLogMessage;
    strLogMessage.append(strLocalTime);
    strLogMessage.append(L" ");
    strLogMessage.append(strFunctionName);
    strLogMessage.append(L": ");
    strLogMessage.append(strErrorMessage);

    m_wofsLogFile << strLogMessage << std::endl;
}

VPErrorHandler* VPErrorHandler::GetInstance()
{
    VPErrorHandler::Initialize();

    return m_spErrorHandler;
}

void VPErrorHandler::GetLogPath()
{
    wchar_t wszFilePath[MAX_PATH + 1];
    ::GetModuleFileName(NULL, wszFilePath, MAX_PATH);
    (_tcsrchr(wszFilePath, _T('\\')))[1] = 0;

    std::wstring strLocalTime;
    GetLocalTime(strLocalTime);

    m_strLogPath.clear();
    m_strLogPath.append(wszFilePath);
    m_strLogPath.append(L"ErrorLog");
    m_strLogPath.append(strLocalTime);
    m_strLogPath.append(L".log");
}

void VPErrorHandler::GetLocalTime(std::wstring& strLocalTime)
{
    strLocalTime.clear();

    time_t t = time(0);
    tm tm;
    localtime_s(&tm, &t);

    wchar_t wszTemp[MAX_PATH + 1];
    _itow_s(tm.tm_year + 1900, wszTemp, 10);
    strLocalTime.append(wszTemp);
    strLocalTime.append(L"-");
    _itow_s(tm.tm_mon, wszTemp, 10);
    strLocalTime.append(wszTemp);
    strLocalTime.append(L"-");
    _itow_s(tm.tm_mday, wszTemp, 10);
    strLocalTime.append(wszTemp);
    strLocalTime.append(L"-");
    _itow_s(tm.tm_hour, wszTemp, 10);
    strLocalTime.append(wszTemp);
    strLocalTime.append(L"-");
    _itow_s(tm.tm_sec, wszTemp, 10);
    strLocalTime.append(wszTemp);
    strLocalTime.append(L"-");
    _itow_s(tm.tm_min, wszTemp, 10);
    strLocalTime.append(wszTemp);
}

void VPErrorHandler::CreateLogFile()
{
    m_wofsLogFile.open(m_strLogPath, std::ios::out | std::ios::app);
    if (!m_wofsLogFile.is_open())
    {
        return;
    }

    m_wofsLogFile << "=========================================================================" << std::endl;
    m_wofsLogFile << "Log Opened" << std::endl;
    m_wofsLogFile << "=========================================================================" << std::endl;
    m_wofsLogFile << std::endl;
}
